using System;
using System.Collections.Generic;
using System.Text;
using NHibernate;
using NHibernate.Cfg;
using System.Collections;
using Servidor.cadastro;
using System.Runtime.InteropServices;
using System.Xml;
using System.Data.SqlClient;

namespace Servidor.persistencia
{
    public class LivroDAO
    {
  
        public LivroDAO()
        {
            HibernateUtil.beginTransaction();            
        }

        public Int32 proximoId()
        {
            ISession session = HibernateUtil.getSession();
            ArrayList l = new ArrayList();
            session.CreateQuery("select max(l.Id) from Livro as l").List(l);
            IEnumerator enumerator = l.GetEnumerator();
            enumerator.MoveNext();

            if (enumerator.Current == null) {
                return 0;
            }
        
            return ((Int32) enumerator.Current) + 1;
           
        }


        // tratar erro depois
        public bool salvarOuAtualizar(Livro livro)
        {
            ISession session = HibernateUtil.getSession();

            try
            {
                session.SaveOrUpdate(livro);
            }
            
            catch (Exception ex)
            {
                return false;
            }

            return true;

        }

        public bool deletar(Livro livro)
        {
            ISession session = HibernateUtil.getSession();

            try
            {
                session.Delete(livro);
            }
            catch (Exception ex)
            {
                return false;
            }

            return true;
        }

        public Livro buscar(string nome)
        {
            ISession session = HibernateUtil.getSession();
            Livro l = null;
            IQuery query = session.CreateQuery("from Livro l where l.Nome = :nome");
            query.SetParameter("nome", nome);

            IList<Livro> lista = (IList<Livro>)query.List<Livro>();
            IEnumerator<Livro> iEnumerator = lista.GetEnumerator();

            iEnumerator.MoveNext();
            l = iEnumerator.Current;

            if (l != null)
            {
                return l;
            }
                  
            return null;
        }

        public Livro buscar(Int32 id)
        {
            ISession session = HibernateUtil.getSession();
            Livro livro = (Livro)session.Load(typeof(Livro), id);

            try
            {
                livro.Nome = livro.Nome;
            } catch (Exception e) 
            {
                return null;
            }            

            return livro; 
        }

        public IList<Livro> listar(string nomeParcial)
        {
            ISession session = HibernateUtil.getSession();
            IQuery query = session.CreateQuery("from Livro l where l.Nome like :nome");
            query.SetParameter("nome", nomeParcial + "%");
            return query.List<Livro>();
        }
    }
}
